/*****************************************************************************
 * Included Files
 ****************************************************************************/
#ifndef _CT_RTC_H
#define _CT_RTC_H


#include "ct_type.h"


#define CT_RTC_TICK_1_SEC     (0x00) /*!< Time tick is 1 second */
#define CT_RTC_TICK_1_2_SEC   (0x01) /*!< Time tick is 1/2 second */
#define CT_RTC_TICK_1_4_SEC   (0x02) /*!< Time tick is 1/4 second */
#define CT_RTC_TICK_1_8_SEC   (0x03) /*!< Time tick is 1/8 second */
#define CT_RTC_TICK_1_16_SEC  (0x04) /*!< Time tick is 1/16 second */
#define CT_RTC_TICK_1_32_SEC  (0x05) /*!< Time tick is 1/32 second */
#define CT_RTC_TICK_1_64_SEC  (0x06) /*!< Time tick is 1/64 second */
#define CT_RTC_TICK_1_128_SEC (0x07) /*!< Time tick is 1/128 second */

// Define RTC clock sources
typedef enum {
    CT_RTC_CLK_LIRC_38P4K = 0,
    CT_RTC_CLK_LXT_32P768K    // Assuming there is another clock source
} RTC_ClockSource;

// Define RTC time scale
typedef enum {
    CT_RTC_CLOCK_12 = 0,
    CT_RTC_CLOCK_24
} RTC_ClockType;

// Define AM/PM for 12-hour format
typedef enum {
    CT_RTC_24M = 0,
    CT_RTC_AM,
    CT_RTC_PM
} RTC_AmPm;

// Define RTC interrupt types
typedef enum {
    CT_RTC_TIME_TICK = 0,
    CT_RTC_ALARM
} RTC_IntType;


// Define days of the week
typedef enum {
    CT_RTC_SUNDAY = 0,
    CT_RTC_MONDAY,
    CT_RTC_TUESDAY,
    CT_RTC_WEDNESDAY,
    CT_RTC_THURSDAY,
    CT_RTC_FRIDAY,
    CT_RTC_SATURDAY
} RTC_WeekDay;

// 定义年份基准
#define RTC_YEAR2000 2000

// 定义时间和日期的结构体
typedef struct {
    uint16_t year;
    uint8_t  month;
    uint8_t  day;
    uint8_t  dayOfWeek;
} RTC_Date_t;

typedef struct {
    uint8_t hour;
    uint8_t minute;
    uint8_t second;
    uint8_t timeMode;    // RTC_CLOCK_12 或 RTC_CLOCK_24
    uint8_t AmPm;        // RTC_AM 或 RTC_PM
} RTC_Time_t;

typedef struct {
    RTC_Date_t date;
    RTC_Time_t time;
} RTC_DateTime_t;


/*****************************************************************************
 * Global Functions
 ****************************************************************************/

void ct_rtc_Run(void);
void ct_rtc_Pause(void);
void ct_rtc_SetDate(const RTC_Date_t *date);
void ct_rtc_SetTime(const RTC_Time_t *time);
void ct_rtc_SetAlarmDate(const RTC_Date_t *date);
void ct_rtc_SetAlarmTime(const RTC_Time_t *time);
void ct_rtc_GetDateAndTime(RTC_DateTime_t *dateTime);
void ct_rtc_GetAlarmDateAndTime(RTC_DateTime_t *dateTime);
void ct_rtc_EnableInterrupt(uint8_t intType);
void ct_rtc_DisableInterrupt(uint8_t intType);
void ct_rtc_SelectClockSource(uint8_t clockSource);

#endif
